打开包长检测特性。包长检测提供了固定包头+包体这种格式协议的解析。启用后,可以保证Worker
进程onReceive
每次都会收到一个完整的数据包。
长度协议提供了3
个选项来控制协议细节。
包头中某个字段作为包长度的值,底层支持了10
种长度类型。请参考 package_length_type
从第几个字节开始计算长度,一般有2种情况:
length
的值包含了整个包(包头+包体),package_body_offset
为0
- 包头长度为
N
字节,length
的值不包含包头,仅包含包体,package_body_offset
设置为N
length
长度值在包头的第几个字节。
struct
{
uint32_t type;
uint32_t uid;
uint32_t length;
uint32_t serid;
char body[0];
}
以上通信协议的设计中,包头长度为4
个整型,16
字节,length
长度值在第3
个整型处。因此package_length_offset
设置为8
,0-3
字节为type
,4-7
字节为uid
,8-11
字节为length
,12-15
字节为serid
。
$server->set(array(
'open_length_check' => true,
'package_max_length' => 81920,
'package_length_type' => 'N',
'package_length_offset' => 8,
'package_body_offset' => 16,
));